﻿using System;
using System.Collections.Generic;
using System.Linq;
using Castle.ActiveRecord;

namespace Matriculex.Dominio
{
    [ActiveRecord("aluno")]
    [Serializable]
    public class Aluno : ActiveRecordBase<Aluno>
    {
        private IList<Disciplina> disciplinasPreSelecionadas;

        public Aluno()
        {
            disciplinasPreSelecionadas = new List<Disciplina>();
            IsBolsista = false;
            Ativado = true;
        }

        [PrimaryKey]
        public int Id { get; set; }
        [Property]
        public string Nome { get; set; }
        [Property]
        public string Endereco { get; set; }
        [Property]
        public string NumeroPECE { get; set; }
        [Property]
        public string Email { get; set; }
        [Property]
        public bool IsBolsista { get; set; }
        [Property]
        public bool Ativado { get; private set; }
        [Property]
        public string Senha { get; set; }

        [HasAndBelongsToMany(typeof(Disciplina), Table = "aluno_disciplina", ColumnKey = "aluno_id",
            ColumnRef = "disciplina_id")]
        public IList<Disciplina> DisciplinasPreSelecionadas
        {
            get { return new List<Disciplina>(disciplinasPreSelecionadas).AsReadOnly(); }
            private set { disciplinasPreSelecionadas = (IList<Disciplina>)value; }
        }

        public void AdicionarDisciplina(Disciplina disciplina)
        {
            disciplinasPreSelecionadas.Add(disciplina);
        }

        public void Ativar()
        {
            Ativado = true;
        }

        public void Desativar()
        {
            Ativado = false;
        }

        public static Aluno Valida(string email, string senha)
        {
            var alunos = from aluno in Aluno.FindAllByProperty("Ativado", true)
                         where aluno.Email == email && aluno.Senha == senha
                         select aluno;
            if (alunos.Count() == 0)
                return null;
            else if (alunos.Count() > 1)
                throw new DominioException("Há mais de um aluno com o mesmo email/senha");
            else // alunos.Count() == 1
            {
                return alunos.First();
            }
        }
    }
}
